package src.H_JDBC;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

// DBCP数据库连接池（单线程，并发量低，性能不好，适用于小型系统），依赖Jakarta commons-pool对象池机制的数据库连接池
public class H_02_DBCP {
    // 前提：先导入jar包，commons-dbcp-1.4、commons-pool-1.6，再准备好配置文件
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet re = null;
        try {
            conn = JdbcUtils_DBCP.getConnection();
            String sql = "insert into tang(name,sex,age) values (?,?,?)"; //使用问号?占位符代替参数
            st = conn.prepareStatement(sql); //预编译SQL，先写sql，然后不执行
            //手动给参数赋值 属性和类型要按顺序匹配 例如id，name 只能 int，string，不可不按顺序反过来
            st.setString(1,"小猪猪");
            st.setString(2,"男");
            st.setInt(3,22);
            int i = st.executeUpdate(); // 执行
            if (i > 0){
                System.out.println("插入成功！");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils_DBCP.release(conn,st,re);
        }
    }
}

class JdbcUtils_DBCP{

    private static DataSource dataSource = null;

    static {
        try {
            // 通过类加载器在classPath目录下获取资源.并且是以流的形式，相当于利用反射读取配置文件
            InputStream is = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("src\\H_JDBC\\H_02_dbcpconfig.properties");
            Properties properties = new Properties();
            // 加载流中的文件的数据，忘记了可参考 F01_Properties 类
            properties.load(is);
            // 创建数据源  工厂模式--> 创建对象，并把读到的内容放到数据源中
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 获取连接
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection(); // 从数据源中获取连接
    }

    // 释放资源
    public static void release(Connection conn, Statement st, ResultSet re){
        try {
            if (re != null){
                re.close();
            }
            if (st != null){
                st.close();
            }
            if (conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}